#!/bin/bash

# SPDX-FileCopyrightText: 2022 - 2023 UnionTech Software Technology Co., Ltd.
#
# SPDX-License-Identifier: GPL-3.0-or-later

# [NOTE] 增加 set -e，让脚本在出错时立即退出，方便调试
set -e

function run_pkexec() {
    # 使用 XDG_RUNTIME_DIR 而非 /tmp，更安全且符合 FHS 标准
    local uid="$(id -u)"
    local runtime_dir="${XDG_RUNTIME_DIR:-/run/user/$uid}"

    # 使用 mktemp 创建真正随机的临时文件，防止竞态条件和符号链接攻击
    local TEMP_ENV_FILE
    TEMP_ENV_FILE=$(mktemp "$runtime_dir/dde-fm-env.XXXXXXXXXX") || {
        echo "Error: Failed to create secure temp file" >&2
        return 1
    }

    # 确保文件权限安全：仅当前用户可读写
    chmod 600 "$TEMP_ENV_FILE"

    echo "Capturing environment before elevating..."
    # 捕获 DISPLAY, XAUTHORITY, 和 XDG_SESSION_TYPE
    echo "export DISPLAY='$DISPLAY'" > "$TEMP_ENV_FILE"
    echo "export XAUTHORITY='$XAUTHORITY'" >> "$TEMP_ENV_FILE"
    echo "export XDG_SESSION_TYPE='$XDG_SESSION_TYPE'" >> "$TEMP_ENV_FILE"
    echo "export XDG_DATA_DIRS='$XDG_DATA_DIRS'" >> "$TEMP_ENV_FILE"

    # [NOTE] xhost 仍然保留，作为一种备用授权机制
    xhost +SI:localuser:root &>/dev/null

    echo "run in pkexec: $@"
    # 将 uid 和临时环境文件路径作为最后两个参数传递，确保解析的稳定性
    pkexec --disable-internal-agent "$0" "$@" "$uid" "$TEMP_ENV_FILE"

    # 安全清理：强制删除并忽略错误
    rm -f "$TEMP_ENV_FILE" 2>/dev/null
    xhost -SI:localuser:root &>/dev/null
}

function run_app() {
    # 健壮的参数解析
    # $1: 原始用户 UID
    # $2: 临时环境文件路径
    # ${@:3}: 传递给文件管理器的原始参数
    local uid="$1"
    local TEMP_ENV_FILE="$2"
    shift 2 # 移除 uid 和 temp_file_path，剩下的是应用参数
    local app_args=("$@")

    local user_name
    user_name=$(getent passwd "$uid" | cut -d: -f1)
    echo "Running as root for user: $user_name (UID: $uid)"

    # 从临时文件中加载关键环境变量
    if [ -f "$TEMP_ENV_FILE" ]; then
        echo "Loading environment from $TEMP_ENV_FILE"
        source "$TEMP_ENV_FILE"
        echo "Environment loaded: DISPLAY=$DISPLAY, XDG_SESSION_TYPE=$XDG_SESSION_TYPE"
    else
        # 如果文件丢失，启动将很可能失败，这里只做警告
        echo "Error: Temp env file not found! GUI application will likely fail." >&2
        # 不再硬编码，让它自然失败会暴露出更准确的错误
    fi

    # 正确设置 D-Bus 和运行时目录，这是连接用户桌面的关键
    export XDG_RUNTIME_DIR="/run/user/$uid"
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

    # 根据会话类型设置环境
    if [ "$XDG_SESSION_TYPE" == "x11" ]; then
        # DISPLAY 和 XAUTHORITY 已通过 source 加载
        export QT_QPA_PLATFORM=dxcb:xcb
        export GDK_BACKEND=x11
    else
        # Wayland 逻辑
        export WAYLAND_DISPLAY=wayland-0
        # DISPLAY 和 XAUTHORITY 已加载，用于 XWayland 兼容
        export QT_WAYLAND_SHELL_INTEGRATION=kwayland-shell
        export XDG_SESSION_TYPE=wayland
        export QT_QPA_PLATFORM=wayland
        export GDK_BACKEND=wayland,x11
    fi


    # [NOTE] 假设 dde-file-manager 是最终执行的程序
    echo "Starting dde-file-manager with args: ${app_args[*]} and CWD: $(pwd)"
    file-manager.sh "${app_args[@]}" -w "$(pwd)"

}

# --- Main script logic ---

echo "run dde-file-manager in $XDG_SESSION_TYPE"
echo "current file: $0"

if [ "$(id -u)" -ne 0 ];then
    run_pkexec "$0" "$@"
    exit 0
fi

# --- 此处代码以 root 权限执行 ---
echo "Running with root privileges."

# 健壮地从末尾解析脚本自身添加的参数
args_array=("$@")
num_args=${#args_array[@]}

# 最后一个参数是临时文件路径
temp_file_path="${args_array[$num_args-1]}"
# 倒数第二个参数是UID
uid="${args_array[$num_args-2]}"

# 原始参数是除了脚本名、uid、tempfile之外的所有内容
# ($0 是脚本名，所以从索引1开始，长度为 num_args-3)
original_params=()
if [ "$num_args" -gt 2 ]; then
    original_params=("${args_array[@]:1:$num_args-3}")
fi

run_app "$uid" "$temp_file_path" "${original_params[@]}"
